home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
051-075
/
disk_056
/
mergemem
/
mergemem.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
3KB
|
78 lines
/* MergeMem.c - by Carolyn Scheppner CBM 02/87
* Attempts to merge the memlists of sequentially configged ram boards
* which have the same Attributes (for contiguous expansion ram)
*
* Note: This program has been tested with an Alegra plugged into
* a Microbotics Starboard's pass-thru. The program makes
* the assumption that sequentially configged ram boards
* have sequential entries in the MemHeader list. If this
* is not always true, then this program may not work for
* some expansion configurations. Works fine for me though.
*/
#include "exec/types.h"
#include "exec/exec.h"
#include "exec/execbase.h"
extern struct ExecBase *SysBase;
main()
{
struct MemChunk *chunk;
struct MemHeader *mem, *firstmem, *prevmem = 0;
struct ExecBase *eb = SysBase;
ULONG memsize;
/* Temps */
struct MemChunk *oldFirst;
APTR oldLower, oldUpper;
ULONG oldFree;
Forbid();
firstmem = (struct MemHeader *)eb->MemList.lh_Head;
/* Go to end of MemHeader list */
for (mem = firstmem;
mem->mh_Node.ln_Succ;
mem = (struct MemHeader *)mem->mh_Node.ln_Succ)
printf("Found memory type $%lx at $%lx\n",mem->mh_Attributes,mem);
/* Back up from terminal node to point at last MemHeader */
mem = (struct MemHeader *)mem->mh_Node.ln_Pred;
/* Backwards, for each except first */
for ( ; (ULONG)mem != (ULONG)firstmem; mem = prevmem)
{
prevmem = (struct MemHeader *)mem->mh_Node.ln_Pred;
/* If prev MemHeader describes neighboring ram of same Attributes */
if(((ULONG)prevmem->mh_Upper == (ULONG)mem->mh_Lower - 32L)&&
(prevmem->mh_Attributes == mem->mh_Attributes))
{
printf("Merging $%lx with $%lx\n",prevmem,mem);
/* Save needed stuff from MemHeader before Remove()ing it */
oldFirst = mem->mh_First;
oldLower = mem->mh_Lower;
oldUpper = mem->mh_Upper;
oldFree = mem->mh_Free;
Remove(mem);
/* Adjust Upper and Free in prev MemHeader to include this mem */
memsize = (ULONG)oldUpper - (ULONG)oldLower +32L;
prevmem->mh_Upper = (APTR)((ULONG)prevmem->mh_Upper + memsize);
prevmem->mh_Free += oldFree;
/* Link last free chunk of prevmem to first free of mem */
for (chunk = prevmem->mh_First;
chunk->mc_Next; chunk = chunk->mc_Next);
chunk->mc_Next = oldFirst;
/* Now FreeMem() the old MemHeader as a 32 byte chunk */
FreeMem(mem,32);
}
}
Permit();
}